Lambda 関数の Java ランタイムにて最大ヒープメモリのサイズを指定する方法を教えてください
困っていること
Lambda 関数の Java ランタイムにて JVM パラメータを利用して最大ヒープメモリサイズの指定を行いたいです。
どのように設定すれば可能でしょうか。
どう対応すればいいの?
現状 Lambda 関数にて最大ヒープメモリサイズの指定を行う方法はございません。
Lambda 関数では下記のドキュメントに記載の通り、環境変数に JAVA_TOOL_OPTIONS を設定することで Java 仮想マシン (JVM) の設定変更が可能です。
しかし、現状最大ヒープメモリサイズ変更には対応しておりません。
Remember that the ability to tweak JVM parameters might change with future service features. You won’t be able to override parameters set by AWS Lambda (for example -Xmx).
最大ヒープメモリサイズは Lambda 関数のメモリ設定に比例いたしますので、変更を行う際は Lambda 関数側のメモリ設定の変更をご検討ください。
やってみた
本当に -Xmx パラメータが未対応なのか実際に検証を行ってみます。
今回利用するソースコードは以下のものになります。
package example;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.util.Map;
import software.amazon.awssdk.services.lambda.LambdaClient;
// Handler value: example.Handler
public class Handler implements RequestHandler<Map<String,String>, String> {
private static final LambdaClient lambdaClient = LambdaClient.builder().build();
@Override
public String handleRequest(Map<String,String> event, Context context) {
LambdaLogger logger = context.getLogger();
logger.log("Handler invoked");
// ヒープメモリ容量を取得
long maxMem = Runtime.getRuntime().maxMemory();
logger.log("Runtime.getRuntime().maxMemory():"+maxMem);
long maxMemM = maxMem/1024/1024;
// 見やすく整形
logger.log("Runtime.getRuntime().maxMemory():"+maxMemM+"M");
return "end";
}
}
上記コードの作成には以下の記事を参考にさせていただきました。
使用するランタイムは java21 です。
以下がそれぞれの条件で実行してみた結果になります。
JAVA_TOOL_OPTIONS | 関数メモリ | 実行結果 |
---|---|---|
指定なし | 512 MB | Runtime.getRuntime().maxMemory():421 MB |
-Xmx256m | 512 MB | Runtime.getRuntime().maxMemory():421 MB |
-Xmx1024m | 512 MB | Runtime.getRuntime().maxMemory():421 MB |
指定なし | 1024 MB | Runtime.getRuntime().maxMemory():842 MB |
-Xmx256m | 1024 MB | Runtime.getRuntime().maxMemory():842 MB |
-Xmx1024m | 1024 MB | Runtime.getRuntime().maxMemory():842 MB |
上記の結果からも -Xmx パラメータは未対応であり、最大ヒープメモリサイズは Lambda 関数のメモリに比例して大きくなることが確認できました。